﻿/**
 * @file NisCoord_Struct.h
 * @brief NisCoord
 * @details 
 * @mainpage http://www.navinfo.com/
 * @author Navinfo
 * @email 400-810-0880
 * @license Navinfo Co.,Ltd. All rights reserved
 */
#ifndef	__NISCOORDSTRUCT_H_
#define	__NISCOORDSTRUCT_H_

PRAGMA_PACK_PUSH

namespace Navinfo {
namespace Nis {

class CCoord2D;
class CCoord3D;
class CCoord2DListFlag;
class CCoord2DList;
class CCoord3DListFlag;
class CCoord3DList;
class CRect2D;
class CRect3D;
class CAdvancedGeometry3DFlag;
class CAdvancedGeometry3D;



/**
 * @brief 二维坐标点
 * 
 */
class DLL_PUBLIC CCoord2D
{
public:
	CCoord2D();

	explicit CCoord2D(
		  const int &m_iX_
		, const int &m_iY_ = 0
		);

public:
	/**
	 * @brief 取得X
	 *
	 * @return X
	 */
	const int& GetX() const;

	/**
	 * @brief 取得Y
	 *
	 * @return Y
	 */
	const int& GetY() const;


public:
	int															m_iX;										///<	  X  
	int															m_iY;										///<	  Y  
};


/**
 * @brief 三维坐标点
 * 
 */
class DLL_PUBLIC CCoord3D
{
public:
	CCoord3D();

	explicit CCoord3D(
		  const int &m_iX_
		, const int &m_iY_ = 0
		, const int &m_iZ_ = 0
		);

public:
	/**
	 * @brief 取得X
	 *
	 * @return X
	 */
	const int& GetX() const;

	/**
	 * @brief 取得Y
	 *
	 * @return Y
	 */
	const int& GetY() const;

	/**
	 * @brief 取得Z
	 *
	 * @return Z
	 */
	const int& GetZ() const;


public:
	int															m_iX;										///<	  X  
	int															m_iY;										///<	  Y  
	int															m_iZ;										///<	  Z  
};


/**
 * @brief Coord2DListFlag
 * 
 */
class DLL_PUBLIC CCoord2DListFlag
{
public:
	CCoord2DListFlag();

	explicit CCoord2DListFlag(
		ushort v_ 
		);

public:

public:
	union {
		ushort													v;
		struct {
			ushort												m_ucNumBits					: 5;			///<	  存储除符号位之外的经纬度值的bit位数，0是非法值。  
			ushort												m_ucNumV0Bits				: 5;			///<	  存储第一个坐标的除符号位之外的经纬度值的bit位数，0是非法值。通常第一个坐标需要更高的精度，因为v0可能距离Mesh中心有一定距离。  
		};
	};
};


/**
 * @brief 二维坐标点列表
 * 
 */
class DLL_PUBLIC CCoord2DList
{
public:
	CCoord2DList();

	explicit CCoord2DList(
		  const CCoord2DListFlag &m_clFlag_
		, const vector< CCoord2D > &m_vclCoord_ = vector< CCoord2D >()
		);

public:
	/**
	 * @brief 取得Coord的数量
	 *
	 * @return Coord的数量
	 */
	size_t GetNumCoord() const;

	/**
	 * @brief 取得数组Coord中下标为iNo的元素
	 * @details 
	 *
	 * @return Coord
	 */
	const CCoord2D& GetCoord( size_t iNo ) const;

	/**
	 * @brief 取得Coord
	 *
	 * @return Coord
	 */
	const vector< CCoord2D >& GetCoord() const;


public:
	CCoord2DListFlag											m_clFlag;									///<	  Flag  
	vector< CCoord2D >											m_vclCoord;									///<	  Coord  
};


/**
 * @brief Coord3DListFlag
 * 
 */
class DLL_PUBLIC CCoord3DListFlag
{
public:
	CCoord3DListFlag();

	explicit CCoord3DListFlag(
		ushort v_ 
		);

public:

public:
	union {
		ushort													v;
		struct {
			ushort												m_ucNumZBits				: 5;			///<	  存储除符号位之外的高度值的bit位数，0是非法值。  
			ushort												m_ucNumXYBits				: 5;			///<	  存储除符号位之外的经纬度值的bit位数，0是非法值。  
			ushort												m_ucNumXYV0Bits				: 5;			///<	  存储第一个坐标的除符号位之外的经纬度值的bit位数，0是非法值。通常第一个坐标需要更高的精度，因为v0可能距离Mesh中心有一定距离。  
		};
	};
};


/**
 * @brief 三维坐标点列表
 * 
 */
class DLL_PUBLIC CCoord3DList
{
public:
	CCoord3DList();

	explicit CCoord3DList(
		  const CCoord3DListFlag &m_clFlag_
		, const vector< CCoord3D > &m_vclCoord_ = vector< CCoord3D >()
		);

public:
	/**
	 * @brief 取得Coord的数量
	 *
	 * @return Coord的数量
	 */
	size_t GetNumCoord() const;

	/**
	 * @brief 取得数组Coord中下标为iNo的元素
	 * @details 
	 *
	 * @return Coord
	 */
	const CCoord3D& GetCoord( size_t iNo ) const;

	/**
	 * @brief 取得Coord
	 *
	 * @return Coord
	 */
	const vector< CCoord3D >& GetCoord() const;


public:
	CCoord3DListFlag											m_clFlag;									///<	  Flag  
	vector< CCoord3D >											m_vclCoord;									///<	  Coord  
};


/**
 * @brief 2D矩形
 * 
 */
class DLL_PUBLIC CRect2D
{
public:
	CRect2D();

	explicit CRect2D(
		  const CCoord2D &m_clSW_
		, const CCoord2D &m_clNE_ = CCoord2D()
		);

public:
	/**
	 * @brief 取得SW
	 *
	 * @return 矩形的左下点
	 */
	const CCoord2D& GetSW() const;

	/**
	 * @brief 取得NE
	 *
	 * @return 矩形的右上点
	 */
	const CCoord2D& GetNE() const;


public:
	CCoord2D													m_clSW;										///<	  矩形的左下点  
	CCoord2D													m_clNE;										///<	  矩形的右上点  
};


/**
 * @brief 3D矩形
 * 
 */
class DLL_PUBLIC CRect3D
{
public:
	CRect3D();

	explicit CRect3D(
		  const CCoord3D &m_clSW_
		, const CCoord3D &m_clNE_ = CCoord3D()
		);

public:
	/**
	 * @brief 取得SW
	 *
	 * @return 矩形的左下点
	 */
	const CCoord3D& GetSW() const;

	/**
	 * @brief 取得NE
	 *
	 * @return 矩形的右上点
	 */
	const CCoord3D& GetNE() const;


public:
	CCoord3D													m_clSW;										///<	  矩形的左下点  
	CCoord3D													m_clNE;										///<	  矩形的右上点  
};


/**
 * @brief AdvancedGeometry3DFlag
 * 
 */
class DLL_PUBLIC CAdvancedGeometry3DFlag
{
public:
	CAdvancedGeometry3DFlag();

	explicit CAdvancedGeometry3DFlag(
		uchar v_ 
		);

public:
	/**
	 * @brief 取得CoordListFlag
	 * @details 
	 *
	 * @return CoordListFlag
	 */
	Navinfo::Nis::BOOL GetCoordListFlag() const;


public:
	union {
		uchar													v;
		struct {
			uchar												m_ucCoordListFlag			: 1;			///<	  CoordListFlag  
		};
	};
};


/**
 * @brief 车道中心线的形状
 * 
 */
class DLL_PUBLIC CAdvancedGeometry3D
{
public:
	CAdvancedGeometry3D();

	explicit CAdvancedGeometry3D(
		  const CAdvancedGeometry3DFlag &m_clFlag_
		, const CCoord3DList &m_clCoordList_ = CCoord3DList()
		);

public:
	/**
	 * @brief 取得Flag
	 *
	 * @return Flag
	 */
	const CAdvancedGeometry3DFlag& GetFlag() const;

	/**
	 * @brief 取得CoordList
	 *
	 * @return CoordList
	 */
	const CCoord3DList& GetCoordList() const;


public:
	CAdvancedGeometry3DFlag										m_clFlag;									///<	  Flag  
	CCoord3DList												m_clCoordList;								///<	  CoordList  
};

}
}

PRAGMA_PACK_POP

#endif	//	__NISCOORDSTRUCT_H_
